package com.ffcs.crmd.tsp.api.dto.netty;

import java.util.concurrent.atomic.AtomicInteger;

import com.ffcs.crmd.tsp.common.netty.RequestCode;
import com.ffcs.crmd.tsp.common.netty.enu.NettyRemotingType;
import com.thoughtworks.xstream.annotations.XStreamAliasType;

/**
 * 
 * 功能说明:自定义的netty通信体
 *
 * @author ZHONGFUHUA
 * 
 * @Date 2016年1月15日 下午5:30:33
 *
 *
 * 版本号  |   作者   |  修改时间   |   修改内容
 *
 */
@XStreamAliasType("RemotingCommand")
public class RemotingCommand {
    
    /**
     * 信号量递增变量
     */
    private static AtomicInteger RequestId = new AtomicInteger(0);
    
    /**
     * 通信类型
     */
    private NettyRemotingType         type      = NettyRemotingType.REQUEST_COMMAND;
    
    /**
     * 请求以及返回编码
     */
    private int                  code;
    
    /**
     * 请求标识
     */
    private int                  opaque;
    
    /**
     * 备注
     */
    private String               remark;
    
    /**
     * 是否为oneway
     */
    private int                  oneway    = 0;
    
    /**
     * 包体
     */
    private byte[]               body;
    
    protected RemotingCommand() {
        
    }
    
    /**
     * 
     * 功能说明:创建请求命令
     * 
     * @param code
     * @return
     */
    public static RemotingCommand createRequestCommand(int code) {
        return createRequestCommand(code, "");
    }
    
    /**
     * 
     * 功能说明:创建请求命令
     * 
     * @param code
     * @param body
     * @return
     */
    public static RemotingCommand createRequestCommand(int code, String body) {
        RemotingCommand cmd = new RemotingCommand();
        cmd.setCode(code);
        cmd.setBody(body.getBytes());
        cmd.setOpaque(RequestId.getAndIncrement());
        return cmd;
    }
    
    /**
     * 
     * 功能说明:创建响应命令
     * 
     * @param code
     * @return
     */
    public static RemotingCommand createResponseCommand(int code) {
        return createResponseCommand(code, "");
    }
    
    /**
     * 
     * 功能说明:创建响应命令
     * 
     * @param code
     * @param body
     * @return
     */
    public static RemotingCommand createResponseCommand(int code, String body) {
        RemotingCommand cmd = new RemotingCommand();
        cmd.setCode(code);
        cmd.setType(NettyRemotingType.RESPONSE_COMMAND);
        cmd.setBody(body.getBytes());
        return cmd;
    }
    
    /**
     * 功能说明: 获取请求以及返回编码
     *
     * @return code 请求以及返回编码
     */
    public int getCode() {
        return code;
    }
    
    /**
     * 功能说明: 设置请求以及返回编码
     *
     * @param code 请求以及返回编码
     */
    public void setCode(int code) {
        this.code = code;
    }
    
    /**
     * 功能说明: 获取请求标识
     *
     * @return opaque 请求标识
     */
    public int getOpaque() {
        return opaque;
    }
    
    /**
     * 功能说明: 设置请求标识
     *
     * @param opaque 请求标识
     */
    public void setOpaque(int opaque) {
        this.opaque = opaque;
    }
    
    /**
     * 功能说明: 获取备注
     *
     * @return remark 备注
     */
    public String getRemark() {
        return remark;
    }
    
    /**
     * 功能说明: 设置备注
     *
     * @param remark 备注
     */
    public void setRemark(String remark) {
        this.remark = remark;
    }
    
    /**
     * 功能说明: 获取包体
     *
     * @return body 包体
     */
    public byte[] getBody() {
        return body;
    }
    
    /**
     * 功能说明: 设置包体
     *
     * @param body 包体
     */
    public void setBody(byte[] body) {
        this.body = body;
    }
    
    /**
     * 功能说明: 获取通信类型
     *
     * @return type 通信类型
     */
    public NettyRemotingType getType() {
        return type;
    }
    
    /**
     * 功能说明: 设置通信类型
     *
     * @param type 通信类型
     */
    public void setType(NettyRemotingType type) {
        this.type = type;
    }
    
    public boolean isResponseType() {
        if (type == NettyRemotingType.RESPONSE_COMMAND) {
            return true;
        }
        return false;
    }
    
    /**
     * 
     * 功能说明:
     *
     */
    public void markOneway() {
        this.oneway = 1;
    }
    
    
    /**
     * 
     * 功能说明:
     *
     */  
    public boolean isOneway() {
        return oneway == 1;
    }
    
    @Override
    public String toString() {
        return "type=" + type + ",code=" + RequestCode.getName(code) + ",opaque=" + opaque
            + ",body=" + new String(body) + ",isOneway=" + isOneway();
    }
    
}
